// TODO:时间日期函数
/**
 *
 * @param {*} time
 * @param {*} cFormat
 */
export function parseTime(time: any, cFormat?: string) {
    if (arguments.length === 0) {
        return null
    }
    const format = cFormat || '{y}-{m}-{d} {h}:{i}:{s}'
    let date
    if (typeof time === 'object') {
        date = time
    } else {
        if (('' + time).length === 10) {
            time = parseInt(time, 0) * 1000
        }
        date = new Date(time)
    }
    const formatObj: any = {
        y: date.getFullYear(),
        m: date.getMonth() + 1,
        d: date.getDate(),
        h: date.getHours(),
        i: date.getMinutes(),
        s: date.getSeconds(),
        a: date.getDay()
    }
    const time_str = format.replace(/{(y|m|d|h|i|s|a)+}/g, (result, key) => {
        let value = formatObj[key]
        // Note: getDay() returns 0 on Sunday
        if (key === 'a') {
            return ['日', '一', '二', '三', '四', '五', '六'][value]
        }
        if (result.length > 0 && value < 10) {
            value = '0' + value
        }
        return value || 0
    })
    return time_str
}

export function debounce(func: any, wait: any, immediate?: boolean) {
    let timer: any = null
    let context: any
    let args: any
    let result: any
    let timestamp: any

    const later: any = () => {
        const oDate = new Date()
        const last = oDate.getTime() - timestamp // 计算第一次时间戳与当前时间戳的差值。

        if (last < wait && last >= 0) {
            // 在等待时间内触发此函数，重新计时。
            timer = setTimeout(later, wait - last)
        } else {
            timer = null
            if (!immediate) {
                // 限制immediate 为true时，执行回调函数。
                result = func.apply(context, args)
                if (!timer) {
                    context = args = null
                }
            }
        }
    }

    return function(this: any) {
        const oDate = new Date()
        const callNow = immediate && !timer // 代表第一次调用立即执行。

        timestamp = oDate.getTime() // 记录下当前时间戳
        context = this // 保存上下文
        args = arguments

        if (!timer) {
            // 第一次触发时，timer为空，进入此分支
            timer = setTimeout(later, wait)
        }

        if (callNow) {
            // 第一次触发且immediate为true，进入此分支
            result = func.apply(context, args)
            context = args = null
        }
        return result
    }
}
